/*
 * Main.cpp
 *
 *  Created on: Dec 22, 2011
 *      Author: allan
 */

// C++ includes
#include <string>

// Eigen includes
#include <Eigen/Core>
using namespace Eigen;

// Boost includes
#include <boost/python.hpp>
using namespace boost::python;

// PyGeoReact includes
#include <Common/NumpyArray.h>
#include <Common/PyEigenMatrix.h>
#include <Common/PyEigenVector.h>
#include <Common/PyPair.h>
#include <Common/PyVector.h>
#include <Common/PyTuple.h>

#include <Core/PyEquilibriumSolver.h>
#include <Core/PyEquilibriumSystem.h>
#include <Core/PyKineticSolver.h>
#include <Core/PyKineticSystem.h>
#include <Core/PyMultiphase.h>

#include <Geochemistry/Kinetics/MineralKinetics/PyMineralKinetics.h>
#include <Geochemistry/PyGeoDatabase.h>
#include <Geochemistry/PyGeoEquilibrator.h>
#include <Geochemistry/PyGeoManager.h>
#include <Geochemistry/PyGeoReactor.h>
#include <Geochemistry/PyGeoState.h>

#include <Numerics/PyOdeSolver.h>

BOOST_PYTHON_MODULE(georeact)
{
	numeric::array::set_module_and_type("numpy", "ndarray");
	
	import_array();
	
	export_std_vector_with_print<int>("IntVector");
	export_std_vector_with_print<unsigned>("UnsignedVector");
	export_std_vector_with_print<double>("DoubleVector");
	export_std_vector_with_print<std::string>("StringVector");
	export_std_vector_with_print<std::pair<double,double>>("DoubleDoubleVector");
	export_std_vector_with_print<std::pair<std::string,double>>("StringDoubleVector");
	export_std_vector_with_print<std::pair<double,std::string>>("DoubleStringVector");
	
	export_std_pair<double,double>("DoubleDoublePair");
	export_std_pair<std::string,double>("StringDoublePair");
	export_std_pair<double,std::string>("DoubleStringPair");
	
	export_std_tuple<unsigned,bool>();
	
	export_EigenMatrix();
	export_EigenVector();
	
	export_Multiphase();
	export_EquilibriumSolver();
	export_EquilibriumSystem();
	export_KineticSolver();
	export_KineticSystem();
	
	export_OdeSolver();
	
	export_GeoDatabase();
	export_GeoManager();
	export_GeoState();
	export_GeoEquilibrator();
	export_GeoReactor();
	export_MineralKinetics();
}
